home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / qs / romahead.s < prev    next >
Text File  |  1995-08-21  |  2KB  |  110 lines

  1. ;--------------------------------------------------------------------------------
  2. ;RomaHead for ASK3 v1.00 1995.08.21 by M.Kamada
  3. ;
  4. ;    int romahead(char *buffer);
  5. ;
  6. ;    機能:
  7. ;        ASK68K version 3.01/3.02 のローマ字変換で、かなに変換されていない
  8. ;        ローマ字の部分を求めます
  9. ;
  10. ;    引数:
  11. ;        buffer    ローマ字を格納するバッファへのポインタ
  12. ;            念のため16バイト程度確保しておくこと
  13. ;
  14. ;    返却値:
  15. ;        1~    かなに変換されていないローマ字の文字数
  16. ;        0    かなに変換されていないローマ字はない
  17. ;        -1    ASK68K が組み込まれていない
  18. ;        -2    ASK68K のバージョンが 3.01/3.02 のいずれでもない
  19. ;        -3    _KNJCTRL のベクタが変更されていて処理できない
  20. ;--------------------------------------------------------------------------------
  21.  
  22.     .include    doscall.mac
  23.     .include    iocscall.mac
  24.  
  25.     .text
  26.     .xdef    _romahead
  27. _romahead:
  28.     movea.l    4(sp),a2        ;buffer
  29.     movem.l    d3-d7/a3-a6,-(sp)
  30. ;ASK68Kのバージョンをチェックする
  31.     moveq.l    #50,d0
  32.     move.l    d0,-(sp)
  33.     DOS    _KNJCTRL
  34.     addq.l    #4,sp
  35.     moveq.l    #-1,d7
  36.     tst.l    d0
  37.     beq    exit            ;ASK68Kが組み込まれていない
  38.     moveq.l    #-2,d7
  39.     tst.l    d0
  40.     bmi    exit            ;ASK68Kのバージョンが違う
  41.     move.w    d0,d6            ;d6.w:バージョン(301/302)
  42.     sub.w    #301,d0
  43.     blo    exit            ;ASK68Kのバージョンが違う
  44.     cmp.w    #302-301,d0
  45.     bhi    exit            ;ASK68Kのバージョンが違う
  46.     lsl.w    #2,d0
  47.     move.w    d0,d5            ;d5.w:バージョン(0/4)
  48.     move.w    #_KNJCTRL,-(sp)
  49.     DOS    _INTVCG
  50.     addq.l    #2,sp
  51.     movea.l    d0,a0
  52.     lea.l    -$63C(a0),a6        ;a6.l:ASK68Kの先頭
  53.     lea.l    v1(pc),a0
  54.     move.l    (a0,d5.w),d0
  55.     lea.l    (a6,d0.l),a1
  56.     IOCS    _B_WPEEK
  57.     moveq.l    #-3,d7
  58.     cmp.w    d6,d0
  59.     bne    exit            ;ベクタが変更されている
  60. ;現在のモードを確認する
  61.     lea.l    v2(pc),a0
  62.     move.l    (a0,d5.w),d0
  63.     lea.l    (a6,d0.l),a1
  64.     IOCS    _B_WPEEK
  65.     move.w    d0,d4            ;d4.w:現在のモード
  66.     bne    mode1
  67. ;モード0(FPを起動していないとき)
  68. mode0:
  69.     lea.l    v3(pc),a0
  70.     move.l    (a0,d5.w),d0
  71.     lea.l    (a6,d0.l),a1
  72.     IOCS    _B_WPEEK
  73.     move.w    d0,d3            ;ローマ字の文字数
  74.     bra    getRoma
  75.  
  76. ;モード0以外(FPを起動しているとき)
  77. mode1:
  78.     lea.l    v4(pc),a0
  79.     move.l    (a0,d5.w),d0
  80.     lea.l    (a6,d0.l),a1
  81.     IOCS    _B_LPEEK
  82.     move.l    d0,d1
  83.     IOCS    _B_LPEEK
  84.     move.w    d0,d3
  85.     sub.w    d1,d3
  86.     lsr.w    #1,d3            ;ローマ字の文字数
  87.     movea.l    d1,a1
  88. ;ローマ字を得る
  89. getRoma:
  90.     moveq.l    #0,d7
  91.     move.w    d3,d7            ;ローマ字の文字数
  92.     beq    getRomaEnd
  93.     subq.w    #1,d3
  94. getRomaLoop:
  95.     IOCS    _B_WPEEK
  96.     move.b    d0,(a2)+
  97.     dbra    d3,getRomaLoop
  98. getRomaEnd:
  99.     clr.b    (a2)
  100. ;終わり
  101. exit:
  102.     move.l    d7,d0
  103.     movem.l    (sp)+,d3-d7/a3-a6
  104.     rts
  105.  
  106. v1:    .dc.l    $DC6A,$DCDE
  107. v2:    .dc.l    $EB22,$EB96
  108. v3:    .dc.l    $1477E,$147F2
  109. v4:    .dc.l    $22C8A,$22CFE
  110.